home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / ASM_TUTR.ZIP / ASMTUTR4.DOC < prev    next >
Text File  |  1984-11-27  |  4KB  |  123 lines

  1.  
  2.  
  3.  
  4. ;COLORINIT EQU       03H    ;Value to initialize color screen (80x25)
  5. COLORINIT EQU       01H         ;Value to initialize color screen (40X25)
  6. ;
  7. ;      Now, describe our own segment
  8. ;
  9. SETSCRN   SEGMENT          ;Set operating segment for CODE and DATA
  10. ;
  11.       ASSUME CS:SETSCRN,DS:SETSCRN,ES:SETSCRN,SS:SETSCRN    ;All segments
  12. ;
  13.       ORG        100H      ;Begin assembly at standard .COM offset
  14. ;
  15. MAIN      PROC        NEAR      ;COM files use NEAR linkage
  16.       JMP        BEGIN     ;And, it is helpful to put the data first, but
  17. ;                  ;then you must branch around it.
  18. ;
  19. ;      Data used in SETSCRN
  20. ;
  21. CHANGELOC   DD        EQUIP     ;Location of the EQUIP, recorded as far pointer
  22. MONOPROMPT  DB        'Please press the plus ( + ) key.$'    ;User sees on mono
  23. COLORPROMPT DB        'Please press the minus ( - ) key.$'   ;User sees on color
  24.  
  25.  
  26. Several things are illustrated on this page.    First, in addition to titles,
  27. the assembler supports subtitles:  hence the SUBTTL pseudo-op.    Second, the
  28. PAGE pseudo-op can be used to go to a new page in the listing.    You see an
  29. example here of the DSECT-style segment in the "SEGMENT AT 40H".  Here, our
  30. our interest is in correctly describing the location of some data in the
  31. BIOS work area which really is located at segment 40H.
  32.  
  33. You will also see illustrated the EQU instruction, which just gives a sym-
  34. bolic name to a number.  I don't make a fetish of giving a name to every
  35. single number in a program.  I do feel strongly, though, that interrupts
  36. and function codes, where the number is arbitrary and the function being
  37. performed is the thing of interest, should always be given symbolic names.
  38.  
  39. One last new element in this section is the define doubleword (DD) instruc-
  40. tion.  A doubleword constant can refer, as in this case, to a location in
  41. another segment.  The assembler will be happy to use information at its
  42. disposal to properly assemble it.  In this case, the assembler knows that
  43. EQUIP is offset 10 in the segment BIOSDATA which is at 40H.
  44.  
  45.        SUBTTL -- Perform function
  46.       PAGE
  47. BEGIN:      CALL        MONOON            ;Turn on mono display
  48.       MOV        DX,OFFSET MONOPROMPT      ;GET MONO PROMPT
  49.       MOV        AH,PRTMSG              ;ISSUE
  50.       INT        DOS               ;IT
  51.       CALL        COLORON            ;Turn on color display
  52.       MOV        DX,OFFSET COLORPROMPT      ;GET COLOR PROMPT
  53.       MOV        AH,PRTMSG              ;ISSUE
  54.       INT        DOS               ;IT
  55.       MOV        AH,GETKEY            ;Obtain user response
  56.       INT        KBD
  57.       CMP        AL,'+'                  ;Does he want MONO?
  58.       JNZ        NOMONO
  59.  
  60.  
  61. IBM PC Assembly Language Tutorial                       26
  62.  
  63.  
  64.  
  65.        CALL      MONOON             ;yes.  give it to him
  66. NOMONO:   RET
  67. MAIN      ENDP
  68.  
  69.  
  70. The main code section makes use of subroutines to keep the basic flow sim-
  71. ple.  About all that's new to you in this section is the use of the BIOS
  72. interrupt KBD to read a character from the keyboard.
  73.  
  74. Now for the subroutines, MONOON and COLORON:
  75.  
  76.        SUBTTL -- Routines to turn monitors on
  77.       PAGE
  78. MONOON      PROC        NEAR        ;Turn mono on
  79.       LES        DI,CHANGELOC    ;Get location to change
  80.       ASSUME    ES:BIOSDATA     ;TELL ASSEMBLER ABOUT CHANGE TO ES
  81.       OR        EQUIP,MONO
  82.       MOV        AX,MONOINIT     ;Get screen initialization value
  83.       INT        SCREEN        ;Initialize screen
  84.       RET
  85. MONOON      ENDP
  86. COLORON   PROC        NEAR        ;Turn color on
  87.       LES        DI,CHANGELOC    ;Get location to change
  88.       ASSUME    ES:BIOSDATA     ;TELL ASSEMBLER ABOUT CHANGE TO ES
  89.       AND        EQUIP,COLOR
  90.       MOV        AX,COLORINIT    ;Get screen initialization value
  91.       INT        SCREEN        ;Initialize screen
  92.       RET
  93. COLORON   ENDP
  94. SETSCRN   ENDS                ;End of segment
  95.       END        MAIN        ;End of assembly; execution at MAIN
  96.  
  97.  
  98. The instructions LES and LDS are useful ones for dealing with doubleword
  99. addresses.  The offset is loaded into the operand register and the segment
  100. into ES (for LES) or DS (for LDS).  By telling the assembler, with an
  101. ASSUME, that ES now addresses the BIOSDATA segment, it is able to correctly
  102. assemble the OR and AND instructions which refer to the EQUIP byte.  An ES
  103. segment prefix is added.
  104.  
  105. To understand the action here, you simply need to know that flags in that
  106. particular byte control how the BIOS screen service initializes the adapt-
  107. ers.  BIOS will only work with one adapter at a time; by setting the equip-
  108. ment flags to show one or the other as installed and calling BIOS screen
  109. initialization, we achieve the desired effect.
  110.  
  111. The rest is up to you.
  112.  
  113.  
  114.  
  115.  
  116.  
  117.  
  118.  
  119.  
  120.  
  121.  
  122. IBM PC Assembly Language Tutorial                      27
  123.